/* 全局变量 */
/* 容量限制 */
#define MAX_DEPT     50    //院系数量
#define MAX_PROJ     100   //项目数量
#define MAX_AWARD    300   //3名 × 项目数
#define MAX_APPEAL   200   //复议记录数量
#define MAX_USER     20    //用户数量
#define MAX_NAME     30    //字符长度
#define MAX_REASON   200   //文字长度（申诉和回复）

/* 前三名系数：用整数避免浮点，100 50 20 代表 1.0 0.5 0.2 */
const int COEFF[3] = {100, 50, 20};



/* 枚举类型 */
typedef enum {
    MALE, FEMALE, MIXED, OPEN
} ProjType;    //项目类型：男子，女子，混合，男女都可以

typedef enum {
    PENDING,   //刚录入
    PUBLISH,   //已公示
    APPEAL,    //有人复议
    REVIEWED,  //复核完毕
    EFFECTIVE  //已生效
} Status;   //信息状态

typedef enum {
    ADMIN, COMMON
} Role;    //用户类型：管理员，普通用户



/* 结构体定义 */
/* 1. 院系 */
typedef struct {
    int  id;                    //院系代号
    char name[MAX_NAME];        //院系名称
    int  totalScore;            //运行时累加分数
    int  removed;               //删除情况：0-有效 1-已删
} Department;

/* 2. 项目 */
typedef struct {
    int  id;                    //项目代号
    char name[MAX_NAME];        //项目名称
    ProjType type;              //项目类型
    int  baseScore;             //第一名基准分
    int  finished;              //比赛结束与否
    int  removed;               //删除情况
} Project;

/* 3. 奖项（名次） */
typedef struct {
    int projId;                 //项目代号
    int rank;                   //名次：1/2/3
    int deptId;                 //获奖院系
    int rawScore;               //实际得分：baseScore*COEFF[rank-1]/100
    long createTime;            //录入时间time_t 秒
} Award;

/* 4. 成绩状态机 */
typedef struct {
    int   projId;               //项目代号
    Status stage;               //信息状态阶段
    long  publishTime;          //进入 PUBLISH 的时刻
    long  appealDeadline;       //超过此时间不能复议
    int   locked;               //是否冻结
} RecordStatus;

/* 5. 复议申请 */
typedef struct {
    int  projId;                //项目代号
    int  deptId;                //申诉方：学院代号
    char reason[MAX_REASON];    //申诉理由
    long submitTime;            //复议申请时间
    int  processed;             //是否已处理
    int  agreed;                //是否同意改成绩
    char reply[MAX_REASON];
} Appeal;

/* 6. 登录用户 */
typedef struct {
    char username[MAX_NAME];    //用户名
    char password[32];          //密码
    Role role;                  //用户类型
} User;



/* 运行时全局数组 + 计数器 */
Department g_depts[MAX_DEPT];       //计算院系数量
int        g_deptCnt = 0;

Project    g_projs[MAX_PROJ];       //计算项目数量
int        g_projCnt = 0;

Award      g_awards[MAX_AWARD];
int        g_awardCnt = 0;

RecordStatus g_status[MAX_PROJ];    //计算项目状态：与项目一一对应
int          g_statusCnt = 0;

Appeal     g_appeals[MAX_APPEAL];   //计算申诉数量
int        g_appealCnt = 0;

User       g_users[MAX_USER] = {
    {"admin", "123456", ADMIN}      //预置管理员
};                                  //计算管理员数量
int        g_userCnt = 1;



/* 读写函数 */
/* 返回 0 成功，-1 失败 */
int loadDepartments(const char* file);    //载入院系
int saveDepartments(const char* file);    //保存院系
int loadProjects   (const char* file);    //载入项目
int saveProjects   (const char* file);    //保存项目
int loadAwards     (const char* file);    //载入获奖
int saveAwards     (const char* file);    //保存获奖
int loadStatus     (const char* file);    //载入状态
int saveStatus     (const char* file);    //保存状态
int loadAppeals    (const char* file);    //载入申诉
int saveAppeals    (const char* file);    //保存申诉
//提交复核